struct Solution {}
/*
给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：

更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
*/
/*
解法：
可以通过双指针法（也称为快慢指针法）来原地修改数组。
这种方法中，我们使用两个指针（或索引），
一个快指针fast用于遍历数组，
一个慢指针slow用于指向不等于val的元素应该存放的位置。
当快指针指向的元素不等于val时，我们将其值赋给慢指针指向的位置，
并同时移动两个指针；如果快指针指向的元素等于val，则只移动快指针。
这样，遍历完数组后，所有不等于val的元素都会被移到数组的前半部分，
而slow的值（即不等于val的元素的数量）就是我们要返回的结果
*/
impl Solution {
    pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
        let mut slow = 0;
        for fast in 0..nums.len() {
          if nums[fast] != val {
            nums[slow] = nums[fast];
            slow += 1;
          }
        }
        slow as i32
    }
}

pub fn main() {
    let mut nums: Vec<i32> = vec![2];
    let value = 3;
    let res = Solution::remove_element(&mut nums, value);
    println!("res={} nums={:?}", res, nums);
}
